use std::borrow::Cow;
use url::Url;

// 使用Cow承载url解析出来的query(pairs)
// 因为常规使用中，query的内容基本上都会提取出来使用，而且提取出来与传递的过程中，都会是新的字符串
// 为了减少新字符串内存分配，可以使用cow承载query pairs，写时才复制，减少内存分配
// 具体：
// 解析url的时候，使用&str指向Url中特定的位置，然后用cow封装

fn main() {
    let url = Url::parse("https://4399.com?name=ddd&hello=world").unwrap();
    let mut pairs = url.query_pairs();
    assert_eq!(pairs.count(), 2);

    let (mut k, v) = pairs.next().unwrap(); // 方法调用会返回两个cow的数据
    println!("key:{} , value:{}", k, v); // 没有修改的时候，两个cow都是借用(borrow)
    k.to_mut().push_str("xxxx"); // 这个时候修改key的内容，k会发生复制（写时复制）

    print_pairs((k, v)); // 打印查看具体的k类型，会发现是Owned

    print_pairs(pairs.next().unwrap());
}

fn print_pairs(pair: (Cow<str>, Cow<str>)) {
    print!("key:{} ,value:{}\n", show_cow(pair.0), show_cow(pair.1));
}

// 看看Cow是哪个类型，借用还是已经发生了复制
fn show_cow(cow: Cow<str>) -> String {
    match cow {
        Cow::Borrowed(v) => format!("Borrow {}", v),
        Cow::Owned(v) => format!("Owned {}", v),
    }
}
